home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1997 December / PC Pro December 1997 CD-Rom coverdisc.iso / symantec / dbAnywh / JAVA.BIN / CLASSES.ZIP / sun / tools / tree / TryStatement.class (.txt) < prev    next >
Encoding:
Java Class File  |  1996-12-14  |  5.1 KB  |  190 lines

  1. package sun.tools.tree;
  2.  
  3. import java.io.PrintStream;
  4. import java.util.Enumeration;
  5. import java.util.Hashtable;
  6. import sun.tools.asm.Assembler;
  7. import sun.tools.asm.CatchData;
  8. import sun.tools.asm.TryData;
  9. import sun.tools.java.ClassDeclaration;
  10. import sun.tools.java.ClassDefinition;
  11. import sun.tools.java.ClassNotFound;
  12. import sun.tools.java.CompilerError;
  13. import sun.tools.java.Constants;
  14. import sun.tools.java.Environment;
  15. import sun.tools.java.Type;
  16.  
  17. public class TryStatement extends Statement {
  18.    Statement body;
  19.    Statement[] args;
  20.  
  21.    public TryStatement(int var1, Statement var2, Statement[] var3) {
  22.       super(101, var1);
  23.       this.body = var2;
  24.       this.args = var3;
  25.    }
  26.  
  27.    long check(Environment var1, Context var2, long var3, Hashtable var5) {
  28.       try {
  29.          var3 = ((Statement)this).reach(var1, var3);
  30.          Hashtable var6 = new Hashtable();
  31.          CheckContext var7 = new CheckContext(var2, this);
  32.          long var8 = this.body.check(var1, var7, var3, var6);
  33.  
  34.          for(int var10 = 0; var10 < this.args.length; ++var10) {
  35.             var8 &= this.args[var10].check(var1, var7, var3, var5);
  36.          }
  37.  
  38.          for(int var11 = 1; var11 < this.args.length; ++var11) {
  39.             CatchStatement var12 = (CatchStatement)this.args[var11];
  40.             if (var12.field != null) {
  41.                Type var13 = var12.field.getType();
  42.                ClassDefinition var14 = var1.getClassDefinition(var13);
  43.  
  44.                for(int var15 = 0; var15 < var11; ++var15) {
  45.                   CatchStatement var16 = (CatchStatement)this.args[var15];
  46.                   if (var16.field != null) {
  47.                      Type var17 = var16.field.getType();
  48.                      ClassDeclaration var18 = var1.getClassDeclaration(var17);
  49.                      if (var14.subClassOf(var1, var18)) {
  50.                         var1.error(this.args[var11].where, "catch.not.reached");
  51.                         break;
  52.                      }
  53.                   }
  54.                }
  55.             }
  56.          }
  57.  
  58.          ClassDeclaration var24 = var1.getClassDeclaration(Constants.idJavaLangError);
  59.          ClassDeclaration var25 = var1.getClassDeclaration(Constants.idJavaLangRuntimeException);
  60.  
  61.          for(int var26 = 0; var26 < this.args.length; ++var26) {
  62.             CatchStatement var27 = (CatchStatement)this.args[var26];
  63.             if (var27.field != null) {
  64.                Type var29 = var27.field.getType();
  65.                if (var29.isType(10)) {
  66.                   ClassDefinition var31 = var1.getClassDefinition(var29);
  67.                   if (!var31.subClassOf(var1, var24) && !var31.superClassOf(var1, var24) && !var31.subClassOf(var1, var25) && !var31.superClassOf(var1, var25)) {
  68.                      boolean var33 = false;
  69.                      Enumeration var19 = var6.keys();
  70.  
  71.                      while(var19.hasMoreElements()) {
  72.                         ClassDeclaration var20 = (ClassDeclaration)var19.nextElement();
  73.                         if (var31.superClassOf(var1, var20) || var31.subClassOf(var1, var20)) {
  74.                            var33 = true;
  75.                            break;
  76.                         }
  77.                      }
  78.  
  79.                      if (!var33) {
  80.                         var1.error(var27.where, "catch.not.thrown", var31.getName());
  81.                      }
  82.                   }
  83.                }
  84.             }
  85.          }
  86.  
  87.          Enumeration var28 = var6.keys();
  88.  
  89.          while(var28.hasMoreElements()) {
  90.             ClassDeclaration var30 = (ClassDeclaration)var28.nextElement();
  91.             ClassDefinition var32 = var30.getClassDefinition(var1);
  92.             boolean var34 = true;
  93.  
  94.             for(int var35 = 0; var35 < this.args.length; ++var35) {
  95.                CatchStatement var36 = (CatchStatement)this.args[var35];
  96.                if (var36.field != null) {
  97.                   Type var21 = var36.field.getType();
  98.                   if (!var21.isType(13) && var32.subClassOf(var1, var1.getClassDeclaration(var21))) {
  99.                      var34 = false;
  100.                      break;
  101.                   }
  102.                }
  103.             }
  104.  
  105.             if (var34) {
  106.                var5.put(var30, var6.get(var30));
  107.             }
  108.          }
  109.  
  110.          return var2.removeAdditionalVars(var8 & var7.vsBreak);
  111.       } catch (ClassNotFound var22) {
  112.          var1.error(super.where, "class.not.found", var22.name, Constants.opNames[super.op]);
  113.          return var3;
  114.       }
  115.    }
  116.  
  117.    public Statement inline(Environment var1, Context var2) {
  118.       if (this.body != null) {
  119.          this.body = this.body.inline(var1, new Context(var2, this));
  120.       }
  121.  
  122.       if (this.body == null) {
  123.          return null;
  124.       } else {
  125.          for(int var3 = 0; var3 < this.args.length; ++var3) {
  126.             if (this.args[var3] != null) {
  127.                this.args[var3] = this.args[var3].inline(var1, new Context(var2, this));
  128.             }
  129.          }
  130.  
  131.          if (this.args.length == 0) {
  132.             return ((Statement)this).eliminate(var1, this.body);
  133.          } else {
  134.             return this;
  135.          }
  136.       }
  137.    }
  138.  
  139.    public Statement copyInline(Context var1, boolean var2) {
  140.       throw new CompilerError("copyInline");
  141.    }
  142.  
  143.    public void code(Environment var1, Context var2, Assembler var3) {
  144.       CodeContext var4 = new CodeContext(var2, this);
  145.       TryData var5 = new TryData();
  146.  
  147.       for(int var6 = 0; var6 < this.args.length; ++var6) {
  148.          Type var7 = ((CatchStatement)this.args[var6]).field.getType();
  149.          if (var7.isType(10)) {
  150.             var5.add(var1.getClassDeclaration(var7));
  151.          } else {
  152.             var5.add(var7);
  153.          }
  154.       }
  155.  
  156.       var3.add(super.where, -3, var5);
  157.       if (this.body != null) {
  158.          this.body.code(var1, var4, var3);
  159.       }
  160.  
  161.       var3.add(var5.getEndLabel());
  162.       var3.add(super.where, 167, var4.breakLabel);
  163.  
  164.       for(int var9 = 0; var9 < this.args.length; ++var9) {
  165.          CatchData var8 = var5.getCatch(var9);
  166.          var3.add(var8.getLabel());
  167.          this.args[var9].code(var1, var4, var3);
  168.          var3.add(super.where, 167, var4.breakLabel);
  169.       }
  170.  
  171.       var3.add(var4.breakLabel);
  172.    }
  173.  
  174.    public void print(PrintStream var1, int var2) {
  175.       super.print(var1, var2);
  176.       var1.print("try ");
  177.       if (this.body != null) {
  178.          this.body.print(var1, var2);
  179.       } else {
  180.          var1.print("<empty>");
  181.       }
  182.  
  183.       for(int var3 = 0; var3 < this.args.length; ++var3) {
  184.          var1.print(" ");
  185.          this.args[var3].print(var1, var2);
  186.       }
  187.  
  188.    }
  189. }
  190.